/* ajax 封装 */
/*======================================*/
// 异步 load content 页面
function loadURL(url, ajax_container) {
    $.ajax({
        type : 'GET',
        url : url,
        dataType : 'html',
        contentType: 'application/x-www-form-urlencoded; charset=utf-8',
        cache : false, // (warning: this will cause a timestamp and will call the request twice)
        async : true,
        beforeSend : function() {
            // loading
            var loadPage =
                '<div class="page-content">'+
                '<div class="cls-container">'+
                '<div class="cls-content">'+
                '<div class="spiner-example">'+
                '<div class="sk-spinner sk-spinner-three-bounce">'+
                '<div class="sk-bounce1"></div>'+
                '<div class="sk-bounce2"></div>'+
                '<div class="sk-bounce3"></div>'+
                '</div>'+
                '</div>'+
                '</div>'+
                '</div>'+
                '</div>';
            ajax_container.html(loadPage);

            // only draw breadcrumb if it is content material
            if (ajax_container[0] == $('#container')[0]) {
                // scroll up
                $('html, body').animate({
                    scrollTop : 0
                }, 'fast');
            } else {
                ajax_container.animate({
                    scrollTop : 0
                }, 'fast');
            }
        },
        complete: function(){
            // Handle the complete event
        },
        success : function(data) {
            // end loading...
            ajax_container.css({
                opacity : '0.0'
            }).html(data).delay(50).animate({
                opacity : '1.0'
            }, 300);

        },
        error : function(xhr, ajaxOptions, thrownError) {
            // error
            var errorPage =
                '<div id="page-content">'+
                '<div class="cls-container">'+
                '<div class="cls-content">'+
                '<h1 class="error-code text-info">404</h1>'+
                '<p class="text-main text-semibold text-lg text-uppercase">页面没有找到!</p>'+
                '<div class="pad-btm text-muted">'+
                '抱歉，你访问的页面地址有误，或者该页面不存在。'+
                '</div>'+
                '<div class="pad-top"><a class="btn-link" href="index">返回首页</a></div>'+
                '</div>'+
                '</div>'+
                '</div>';
            ajax_container.html(errorPage);
        }
    });
}

// ajax get
function __ajax_get(url, params, success, opt){
    var defaults = {
        cache : false,
        url : url,
        timeout : 300000,
        type : 'GET',
        data : params,
        dataType : 'json',
        beforeSend : null,
        complete : null,
        success : function(data){
            if(typeof success === 'function'){
                success(data, params);
            }
        },
        error : function(data){
            if(typeof success === 'function'){
                success(data, params);
            }
        }
    };
    var options = $.extend({}, defaults, opt);
    $.ajax(options);
}

// 发送ajax请求 post
function __ajax_post(url, params, success, opt){
    var defaults = {
        cache: false,
        timeout : 300000,
        url: url,
        type:'POST',
        data: params,
        dataType: 'json',
        beforeSend: null,
        complete: null,
        success: function (data) {
            if(typeof success === 'function'){
                success(data, params);
            }
        },
        error: function (data) {
            if(typeof success === 'function'){
                success(data, params);
            }
        }
    };
    var options = $.extend({}, defaults, opt);
    $.ajax(options);
}

//保存方法
function __form_save(form_id, url, success, opt){
    var defaults = {
        dialogId: null,
        showMessage: true
    };
    var options = $.extend({}, defaults, opt);

    $('#'+form_id+' input:disabled').removeAttr('disabled');
    var params = $('#'+form_id).serialize();
    __ajax_post(url, params, function(data, params){
        if(options.showMessage){
            __toastr(data);
        }
        if(typeof success === 'function'){
            var params_save = $.extend({}, params, {
                dialogId: options.dialogId
            });
            success(data, params_save);
        }
    });
}


/* url 返回菜单视图 */
/*======================================*/
function returnToHashUrl(id) {
    var urlHash = window.location.hash;
    var url = urlHash.substring(1,urlHash.length);
    if(id){
        loadURL(url,id);
    }else{
        loadURL(url,$('#page-content'));
    }
}


/* jqGrid 封装 */
/*======================================*/
function __init_jqgrid(table_id, page_id, url, colNames, colModel, search, opt){
    var table = $("#"+table_id+"");
    var defaults = {
        url : url,
        loadonce : opt,
        multiselect : false,
        datatype : 'json',
        height : 'auto',
        autowidth : true,
        colNames: colNames,
        colModel: colModel,
        pager: '#'+page_id,
        page : 1,
        pagerpos : "center",
        rowList: [10, 20, 30],
        rowNum: 10,
        rownumbers: true,
        jsonReader: {
            root: 'dataRows',
            repeatitems: false
        },
        prmNames: {
            search:'search'
        },
        gridview: true,
        viewrecords: true,
        viewsortcols: [true, 'vertical', true]
    };

    var option = $.extend({},defaults,opt);
    table.jqGrid(option);
    table.jqGrid('navGrid', '#'+page_id, {
        add: false,
        edit: false,
        del: false,
        search: false
    });

    if (search) {
        table.jqGrid('filterToolbar', {searchOperators:false, stringResult:true});
    }
}


/*======================================*/
/**
 * dataTables 封装
 * @param table_id table的id值
 * @param url 数据源连接地址
 * @param columns 表格内容
 * @param buttons 按钮内容
 * @param serverSide 是否开启服务器模式
 * @param opt
 */
function __init_dataTables(table_id, url, columns, buttons, serverSide, opt){
    var table = $("#" + table_id);
    var defaults = {
        ajax : url,
        dom : "Bf<t>ipl", //各个搜索分页提示信息这些按钮的位置
        // responsive : true, //可响应式的（根据宽度决定某列显示隐藏）
        rowId: 'id', //服务器获取的数据id字段作为tr的id属性
        select : true, //是否可以选择
        processing : true, //是否显示处理状态
        autoWidth : true, //自动适应宽度
        info : true, //左下角是否显示分页状态信息
        lengthChange : true, //默认左上角会出现改变每页行出的下拉框
        ordering : true, //配置全局是否启用排序功能
        paging : true, //是否开启本地分页
        scrollX : false, //设置水平滚动
        scrollY : false, //设置垂直滚动，（值可以是高度像素值，多少px）
        scrollCollapse : true, //当数据量少时，表格是否根据内容较少高度（设置false的话，scrollY要有一个固定高度值）
        searching : true, //是否开启本地搜索
        stateSave : true, //是否开启状态保存
        deferRender : false, //延迟渲染，能提高初始化速度但不建议开启
        serverSide : serverSide, //是否开启服务器模式（分页搜索的任务由服务器处理）
        displayStart : 0, //第一次进入页面时从第几条数据开始显示
        lengthMenu : [10,15,20,50], //行数选择下拉框里内容
        pageLength : 10, //默认每页显示的行数
        orderClasses : true, //是否高亮显示被排序的列（是给该列所有单元格加上一个class。分别是 sorting_1 ，sorting_2 和sorting_3 。）
        orderMulti : false, //多列排序（按住shift点击表头多列排序）
        order : [], //设置默认排序（"order" : [[0, 'asc'],[1, 'asc']]）
        pagingType : "simple_numbers", //分页按钮样式（numbers, simple, simple_numbers, full, full_numbers, first_last_numbers）
        language : {
            sProcessing : "处理中...",
            sLengthMenu : "_MENU_",
            sZeroRecords : "没有匹配结果",
            sInfo : "显示第 _START_ 至 _END_ 项结果，共 _TOTAL_ 项",
            sInfoEmpty : "显示第 0 至 0 项结果，共 0 项",
            sInfoFiltered : "(由 _MAX_ 项结果过滤)",
            sInfoPostFix : "",
            sSearch : "搜索:",
            sUrl : "",
            sEmptyTable : "表中数据为空",
            sLoadingRecords : "载入中...",
            sInfoThousands : ",",
            oPaginate : {
                sFirst : "首页",
                sPrevious : "上页",
                sNext : "下页",
                sLast : "末页"
            },
            oAria : {
                sSortAscending : ": 以升序排列此列",
                sSortDescending : ": 以降序排列此列"
            }
        },
        columns : columns,
        buttons : buttons ? buttons : []
    };

    var option = $.extend({},defaults,opt);
    table.DataTable(option);
}


/* 弹出框 */
/*======================================*/
var Admin_Package_BootstrapDialog = function (dialog) {
    this.setDialog(dialog)
};

Admin_Package_BootstrapDialog.prototype = {
    getDialog: function () {
        return this.dialog;
    },
    setDialog: function (dialog) {
        this.dialog = dialog;
        return this;
    },
    id : function () {
        return this.getDialog().getId()
    },
    enableButtons : function () {
        this.getDialog().enableButtons(true);
        return this;
    },
    disenableButtons : function () {
        this.getDialog().enableButtons(false);
        return this;
    },
    close : function () {
        this.getDialog().close();
        return this;
    }
};

// 弹出框
function __open_dialog(size, title, url, buttons, opt){
    var defaults = {
        size : size,
        title : title,
        message : function(dialog){
            var $message = $('<div class="form-read"></div>')
            var pageToLoad = dialog.getData("pageToLoad");
            $message.load(pageToLoad);
            return $message;
        },
        data : {
            pageToLoad : url
        },
        closable : true,
        buttons : buttons,
        draggable : true,
        resizable : true
    };

    var options = $.extend({}, defaults, opt);
    var dialog = BootstrapDialog.show(options);
    return new Admin_Package_BootstrapDialog(dialog);
}

// 提示框
function __alert_dialog(type, size, title, message, buttons, opt) {
    var defaults = {
        type: type,
        size: size,
        title: title,
        message: message,
        buttons: buttons
    };
    var options = $.extend({}, defaults, opt);

    var dialog = BootstrapDialog.show(options);
    return new Admin_Package_BootstrapDialog(dialog);
}

// 表单 dialog
function __open_dialog_form(title, url, confirm, opt) {
    var dialogRef = __open_dialog(BootstrapDialog.SIZE_WIDE, title, url,
        [{
            icon: 'ti-check',
            label: '保存',
            cssClass: 'btn-primary',
            action: function () {
                dialogRef.disenableButtons();
                if(typeof confirm === 'function'){
                    confirm(dialogRef);
                }
            }
        }, {
            icon: 'ti-close',
            label: '关闭',
            cssClass: 'btn-default',
            action: function () {
                dialogRef.close();
            }
        }],
        opt
    );
    return dialogRef;
}

// 只读表单 dialog
function __open_dialog_form_read(title, url, opt) {
    var dialogRef = __open_dialog(BootstrapDialog.SIZE_WIDE, title, url,
        [{
            icon: 'ti-close',
            label: '关闭',
            cssClass: 'btn-default',
            action: function () {
                dialogRef.close();
            }
        }],
        opt
    );
    return dialogRef;
}

// 选择框 dialog
function __open_dialog_select(title, url, confirm, opt, size) {
    var width = BootstrapDialog.SIZE_NORMAL;
    if(size){
        width = size;
    }
    var dialogRef =  __open_dialog(width, title, url,
        [{
            label: '确定',
            cssClass: 'btn-primary',
            action: function () {
                dialogRef.disenableButtons();
                if(typeof confirm === 'function'){
                    confirm(dialogRef);
                }
            }
        }, {
            label: '取消',
            action: function () {
                dialogRef.close();
            }
        }],
        opt
    );
    return dialogRef;
}

//提示框
function __alert(message, opt){
    var dialogRef = __alert_dialog(BootstrapDialog.TYPE_PRIMARY, BootstrapDialog.SIZE_SMALL, "提示", message,
        [{
            label : "确定",
            cssClass: 'btn-default',
            action: function () {
                dialogRef.close();
            }
        }],opt);
    return dialogRef;
}

// 确认 提示框
function __confirm_dialog(title, message, confirm, cancel, opt) {
    var dialogRef = __alert_dialog(BootstrapDialog.TYPE_PRIMARY, BootstrapDialog.SIZE_SMALL, title, message,
        [{
            label: '取消',
            cssClass: 'btn-default',
            action: function () {
                dialogRef.close();
                if(typeof cancel === 'function'){
                    cancel(dialogRef);
                }
            }
        }, {
            label: '确定',
            cssClass: 'btn-primary',
            action: function () {
                dialogRef.close();
                if(typeof confirm === 'function'){
                    confirm(dialogRef);
                }
            }
        }],
        opt
    );
    return dialogRef;
}

// 确认输入提示框
function __confirm_dialog_input(title, placeholder, value, confirm, cancel, opt) {
    var $input = $('<input type="text" class="form-control" value="'+value+'" placeholder="'+placeholder+'" autofocus>');
    var dialogRef = __alert_dialog(BootstrapDialog.TYPE_PRIMARY, BootstrapDialog.SIZE_SMALL, title,
        function () {
            var $message = $('<div class="form-group"></div>');
            $message.append($input);
            return $message;
        },
        [{
            label: '取消',
            cssClass: 'btn-default',
            action: function () {
                dialogRef.close();
                if(typeof cancel === 'function'){
                    cancel(dialogRef);
                }
            }
        }, {
            label: '确定',
            cssClass: 'btn-primary',
            action: function () {
                dialogRef.disenableButtons();
                var inputValue = $input.val();
                if(typeof confirm === 'function'){
                    confirm(dialogRef, inputValue);
                }
            }
        }],
        opt
    );
    return dialogRef;
}


/* bootstrapValidator */
/*======================================*/
function __init_bootstrapValidator(form_id, fields, success, opt){

    var faIcon = {
        required: 'ti-wand icon-md',
        valid: 'ti-check icon-md',
        invalid: 'ti-close icon-md',
        validating: 'ti-reload icon-md'
    };

    var defaults = {
        message: '请输入有效的字段',
        excluded: [':disabled'],
        feedbackIcons: null,
        fields: fields
    };

    var options = $.extend({}, defaults, opt);
    var v = $('#'+form_id).bootstrapValidator(options);

    // $(e.target)  --> The field element
    // data.bv      --> The BootstrapValidator instance
    // data.field   --> The field name
    // data.element --> The field element
    // console.log(e);
    return v.on("status.field.bv", function(e,data){
        console.log(data);
        var $element = $(data.element);
        var $parent = $element.parents('.form-group');
        $parent.removeClass('has-success');
    }).on('success.form.fv', function(e){
        e.preventDefault();
    });

}

function __is_validate(form_id){
    return $("#"+form_id+"").data("bootstrapValidator").validate().isValid();
}


/* validate */
/*======================================*/
function __init_validate(form_id, opt) {
    var defaults = {
        ignore: "",
        errorElement : 'small',
        errorClass : 'help-block',
        errorPlacement : function(error, element) {
            if (element.is(':checkbox') || element.is(':radio')) {
                error.appendTo(element.parent().parent());
            } else {
                error.appendTo(element.parent());
            }
        },
        highlight : function(element) {
            $(element).closest('.form-group').addClass('has-error');
        },
        unhighlight : function(element) {
            $(element).closest('.form-group').removeClass('has-error');
        }
    };

    var options = $.extend({}, defaults, opt);
    $('#'+form_id).validate(options)
}


/* toastr 封装 */
/*======================================*/

function __toastr_primary(title, message){
    $.niftyNoty({
        type: 'primary',
        container : "floating",
        title : title,
        message : message,
        closeBtn : true,
        timer : 3000
    });
}

function __toastr_success(message){
    $.niftyNoty({
        type: 'success',
        container : "floating",
        // title : '成功',
        message : message,
        closeBtn : true,
        timer : 3000
    });
}

function __toastr_info(message){
    $.niftyNoty({
        type: 'info',
        container : "floating",
        title : '消息',
        message : message,
        closeBtn : true,
        timer : 3000
    });
}

function __toastr_warning(message){
    $.niftyNoty({
        type: 'warning',
        container : "floating",
        title : '提示',
        message : message,
        closeBtn : true,
        timer : 5000
    });
}

function __toastr_error(message){
    $.niftyNoty({
        type: 'danger',
        container : "floating",
        title : '错误',
        message : message,
        closeBtn : true,
        timer : 5000
    });
}

function __toastr(data){
    if (data) {
        if(data.state == 1){
            __toastr_success(data.message);
        }else{
            __toastr_error(data.message);
        }
    }else{
        __toastr_error("操作失败");
    }
}

//按钮loading状态
function __btn_loading(btn){
    if(!btn.attr("data-loading-text")){
        btn.attr("data-loading-text", " Loading...");
    }
    btn.button("loading");
}

//重置按钮（取消loading状态）
function __btn_reset(btn){
    btn.button("reset");
}

/* bootstrap-datetimepicker */
/*======================================*/

function __datepicker_day(inputId, opt){
    __datetimepicker(inputId, opt);
}

function __datepicker_month(inputId, opt){
    var def = {
        format : "yyyy-mm",
        startView : 1,
        minViewMode : 1
    };
    var option = $.extend({}, def, opt);
    __datetimepicker(inputId, option)
}

function __datepicker_year(inputId, opt){
    var def = {
        format : "yyyy",
        startView : 2,
        minViewMode : 2
    };
    var option = $.extend({}, def, opt);
    __datetimepicker(inputId, option)
}

/*
* view：
* 0 日视图
* 1 月视图
* 2 年视图
* 3 十年视图
* 4 百年视图*/
function __datetimepicker(inputId, opt){
    var defaults = {
        format : "yyyy-mm-dd",
        weekStart : 0,
        autoclose : true,
        startView : 0,
        minViewMode : 0,
        maxViewMode : 4,
        todayBtn : "linked",
        clearBtn : false,
        todayHighlight : true,
        keyboardNavigation : true,
        language : 'zh-CN',
        forceParse : true
    };

    var options = $.extend({}, defaults, opt);
    $("#" + inputId).datepicker(options);
}